package packageController;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map.Entry;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import packageBusiness.PanierManager;
import packageDataAccess.CompositionSyllathequeData;
import packageException.*;
import packageModel.Composition;
import packageModel.Utilisateur;

/**
 *
 * @author Lionel & Julien
 */
public class ModifierPanierSyllatheque extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");        
        try {
            // ---------------------------
            // Variable passé en requête
            int syllabusId = Integer.parseInt(request.getParameter("syllabusId"));
            int quantite = Integer.parseInt(request.getParameter("quantite"));
            int compoId = Integer.parseInt(request.getParameter("compoId"));
            
            String key = "";
            if(quantite < 0 || quantite >= 99)
                throw new InvalideDonneesException();

            // On récupére la session courante
            HttpSession session = request.getSession();
            
            // Récupération de l'utilisateur
            Utilisateur usr = (Utilisateur)session.getAttribute("usr");
            
            // L'utilisateur est-il connecté ?
            if(session.getAttribute("usr") != null) {
                PanierManager cde = new PanierManager();
                Composition compo = null;
                Composition nomSyll = null;
                
                if(quantite == 0) {
                    // Suppression de l'article
                    // Récupération de la HashMap
                    HashMap <String, Composition> hashPanier = usr.getHashPanier();
                    
                    // On boucle jusqu'à tomber sur notre syllabus
                    for(Entry<String, Composition> entree : hashPanier.entrySet()) {
                        // On vérifie si c'est notre syllabus et si on veut bien le supprimer !
                        if(syllabusId == entree.getValue().getSyllabus().getSyllabusId()) {
                            if(quantite == 0) {
                                key = entree.getKey();
                                nomSyll = entree.getValue();
                                
                                // ---------------------------
                                // Création des variables pour la vue
                                request.setAttribute("deleteSyllabus", nomSyll.getSyllabus().getLibelle());
                            }
                        }                 
                    }

                    // Si on a bien trouvé une clée, alors, on supprime la composition de notre HashMap 
                    // et de notre base de données 
                    if(!key.equals("")) {
                        hashPanier.remove(key);
                        
                        CompositionSyllathequeData cs_bd = new CompositionSyllathequeData();
                        cs_bd.deleteCompo(nomSyll.getCompoId());
                    }
                } else {
                    // Modification de la quantite de l'article
                    compo = cde.modifyQuantity(syllabusId, usr.getPseudo(), quantite, "egal");
                    request.setAttribute("modifSyllabus", compo.getSyllabus().getLibelle());
                }
            } else {
                HashMap <String, Composition> hashPanier = (HashMap)session.getAttribute("panierInvite");
                
                key = "";
                for(Entry<String, Composition> entree : hashPanier.entrySet()) { 
                    // On vérifie si c'est notre syllabus et si on veut bien le supprimer !
                    if(syllabusId == entree.getValue().getSyllabus().getSyllabusId()) {
                        // Veut-on supprimer l'article ?
                        if(quantite == 0) {
                            // On récupère la clé de notre composition
                            key = entree.getKey();
                            
                            // ---------------------------
                            // Création des variables pour la vue
                            request.setAttribute("deleteSyllabus", entree.getValue().getSyllabus().getLibelle());
                        } else {
                            entree.getValue().setQuantite(quantite);
                            request.setAttribute("modifSyllabus", entree.getValue().getSyllabus().getLibelle());
                        }
                    }                 
                }
                
                // Si la clé a été trouvé, on supprime la composition de notre HashMap
                if(!key.equals(""))
                    hashPanier.remove(key);
                
                // On écrase notre panier 
                // (afin qu'il prenne en compte notre dernière modification)
                session.setAttribute("panierInvite", hashPanier);
            }
            
            // ---------------------------
            // Redirection vers une page pour la vue
            RequestDispatcher rd = request.getRequestDispatcher("panier.jsp");
            rd.forward(request, response);
            
        } catch (CommandeException e1) {
            // Erreur
            request.setAttribute("error", e1.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch (CompositionException e2) {
            // Erreur
            request.setAttribute("error", e2.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch (SyllabusException e3) {
            // Erreur
            request.setAttribute("error", e3.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch (InvalideDonneesException e4) {
            // Erreur
            request.setAttribute("errorInvalideDonnees", e4.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch(NumberFormatException nfe) {
            // Erreur
            request.setAttribute("errorNb", "Le nombre attendu n'est pas un nombre");
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch (DataException e5) {
            // Erreur
            request.setAttribute("error", e5.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        }
        
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
